from rest_framework import serializers
from demo import models

# 模型User的序列化器
class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField(label='ID', read_only=True)
    username = serializers.CharField(max_length=20)
    phone = serializers.CharField(max_length=20)

# 模型Book的序列化器
class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField(label='ID', read_only=True)
    bookname = serializers.CharField(label='书名', required=True)
    price = serializers.CharField(label='价格', required=True)
    # 可以额外增加字段
    # author = serializers.CharField(label='作者', required=True)
    # 外键关联
    # bookuser = serializers.PrimaryKeyRelatedField(label='买家', read_only=True)
    # bookuser = serializers.PrimaryKeyRelatedField(queryset=models.User.objects.all())
    # User_set = UserSerializer(many=True)

    ### 反序列化
    # 反序列化 针对单一字段，追加校验逻辑
    def validate_bookname(self, value):
        if 'hello' not in value.lower():
            raise serializers.ValidationError('没有关键字hello')

        # 校验什么，就要原封不动的返回什么
        return value

    # 反序列化 联合校验，追加校验逻辑
    def validate(self, attrs):
        """
        :param attrs: 是一个字典
        :return: 校验什么，就要原封不动的返回什么
        """
        if '123' not in attrs['bookname'].lower() or '123' not in attrs['price'].lower():
            raise serializers.ValidationError('所有字段必须有123')
        return attrs

    # 这里是补充 DefalutSerializerViews 视图中的 save方法
    # 反序列化，上传和更新，post请求
    def create(self, validated_data):
        """
        当序列化器是serializers.Serializer，调用序列化器的save方法时，没有instance，只有data
        :param validated_data:要创建的字段和对应的值
        :return:
        """
        book = models.Book.objects.create(**validated_data)
        return book

    # put请求
    def update(self, instance, validated_data):
        """
        当序列化器是serializers.Serializer，调用序列化器的save方法时，有instance，有data
        :param instance:要修改的模型对象
        :param validated_data:要修改的字段和对应的值
        :return:
        """
        instance.bookname = validated_data.get('bookname')
        instance.price = validated_data.get('price')
        instance.save()

# 模型Book的ModelSerializer序列号器
class DrfBookSerializer(serializers.ModelSerializer):
    class Meta:
        # 指定序列化器从哪个模型映射字段
        model = models.Book

        # 映射哪些字段，三种写法：
        # # 需要注意的是，对接下面三种写法
        # fields = '__all__'
        # exclude = ['price']  # 除了price字段，其他字段都需要
        # fields = ['bookname', 'price', 'bookuser']
        fields = '__all__'

        # # 可以单独自定义模型之外的字段
        # bookuser = serializers.CharField()


        # 调整字段选项参数
        # extra_kwargs = {
        #     'bookname': {'max_length': 50}
        # }

        # 表示哪些字段只能做序列化
        # read_only_fields = ['price']

# 模型User的ModelSerializer序列号器
class DrfUserSerializer(serializers.ModelSerializer):
    class Meta:
        # 指定序列化器从哪个模型映射字段
        model = models.User
        # 映射哪些字段
        fields = '__all__'
